package com.ruoyi.erp.service;

import java.util.List;

import com.ruoyi.erp.domain.SearchMonthBill;
import com.ruoyi.erp.domain.StaffingMonthBill;

/**
 * 外派月账单Service接口
 * 
 * @author sauger
 * @date 2022-03-17
 */
public interface IStaffingMonthBillService 
{
    /**
     * 查询外派月账单
     * 
     * @param id 外派月账单主键
     * @return 外派月账单
     */
    public StaffingMonthBill selectStaffingMonthBillById(Integer id);

    /**
     * 查询外派月账单列表
     * 
     * @param staffingMonthBill 外派月账单
     * @return 外派月账单集合
     */
    public List<StaffingMonthBill> selectStaffingMonthBillList(StaffingMonthBill staffingMonthBill);

    /**
     * 新增外派月账单
     * 
     * @param staffingMonthBill 外派月账单
     * @return 结果
     */
    public int insertStaffingMonthBill(StaffingMonthBill staffingMonthBill);

    /**
     * 修改外派月账单
     * 
     * @param staffingMonthBill 外派月账单
     * @return 结果
     */
    public int updateStaffingMonthBill(StaffingMonthBill staffingMonthBill);

    /**
     * 批量删除外派月账单
     * 
     * @param ids 需要删除的外派月账单主键集合
     * @return 结果
     */
    public int deleteStaffingMonthBillByIds(String ids);

    /**
     * 删除外派月账单信息
     * 
     * @param id 外派月账单主键
     * @return 结果
     */
    public int deleteStaffingMonthBillById(Integer id);

    /**
     * 根据外派人员产生应结算费用
     * @param projectMemberId
     */
    public void calculateMonthByPerson(Integer projectMemberId, Integer year, Integer month);

    //计算某一条月账单
    public void calculateMonthBillById(Integer id);

    /**
     * 根据项目id，批量更新月账单
     * @param year 需要产生的年
     * @param month 需要产生的月份
     * @param projectIds 需要产生的项目id
     * @param force 如果已经产生过，是否要强制产生并覆盖原有记录
     * @return 成功修改的记录条数
     */
    public int batchCalculateBillByProjectId(Integer year, Integer month, List<Integer> projectIds, Boolean force);

    /**
     * 根据项目id，批量更新月账单
     * @param year 需要产生的年
     * @param month 需要产生的月份
     * @param customerIds 需要产生的客户id
     * @param force 如果已经产生过，是否要强制产生并覆盖原有记录
     * @return 成功修改的记录条数
     */
    public int batchCalculateBillByCustomerId(Integer year, Integer month, List<Integer> customerIds, Boolean force);

    /**
     * 根据项目id，批量更新月账单
     * @param year 需要产生的年
     * @param month 需要产生的月份
     * @param personIds 需要产生的人员id
     * @param force 如果已经产生过，是否要强制产生并覆盖原有记录
     * @return 成功修改的记录条数
     */
    public int batchCalculateBillByPersonId(Integer year, Integer month, List<Integer> personIds, Boolean force);

    /**
     *
     * @param year 需要产生的年
     * @param month 需要产生的月份
     * @param force 如果已经产生过，是否要强制产生并覆盖原有记录
     * @return 成功修改的记录条数
     */
    public int batchCalculateBill(Integer year, Integer month, Boolean force);

    /**
     * 初始化产生某月的账单，如果已经产生的，则忽略，根据人员和当月的新增天数插入
     * @param year
     * @param month
     * @return
     */
    public int initMonthBills(Integer year, Integer month);

    public List<StaffingMonthBill> searchStaffingMonthBill(SearchMonthBill search);

    /**
     * 导入数据
     * @param bills
     * @param operator 操作人
     * @param calculate 导入后，是否立即计算
     * @param update 如果存在，是否更新
     * @return
     */
    public String importData(List<StaffingMonthBill> bills, String operator, boolean calculate, boolean update);

    /**
     * 计算月账单毛利率
     * @param bill
     */
    public void calculateProfitRate(StaffingMonthBill bill);

    public List<StaffingMonthBill> selectStaffingMonthBillByIds(String[] ids);

}
